package com.wn.login.utils

import androidx.lifecycle.MutableLiveData
import com.tencent.mmkv.MMKV
import com.wn.common.constant.USER_INFO_DATA
import com.wn.common.constant.USER_PHONE_NUMBER
import com.wn.common.model.User

/**
 * @Author: wn
 * @Date: 2025/7/10 17:12
 * @Description: 用户信息 管理类
 */
object UserManager {

  private val mmkv by lazy {
    MMKV.defaultMMKV()
  }

  private val userLiveData = MutableLiveData<User?>()

  /**
   * 获取用户信息
   * @return User
   * decodeParcelable  mmkv 直接返回 对象
   */
  fun getUserInfo(): User? = mmkv.decodeParcelable(USER_INFO_DATA, User::class.java)

  /**
   * 是否登录 -- 重启应用 数据依然在
   * @return Boolean
   */
  fun isLogin(): Boolean = getUserInfo() != null

  /**
   * 保存用户信息  mmkv 与 LiveData 同时 保存
   * @param originalUser User?
   */
  fun saveUserInfo(originalUser: User) {
    // 根据 user 生成 user2
    val user2 = User(
      id = originalUser.id,
      username = originalUser.username,
      nickname = originalUser.nickname,
      token = originalUser.token,
      icon = originalUser.icon,
      email = originalUser.email,
      password = originalUser.password,
      signature = originalUser.signature,
      sex = originalUser.sex,
      birthday = originalUser.birthday
    )
    mmkv.encode(USER_INFO_DATA, user2)
    /**
     * 用于判断 LiveData 当前是否有活跃的观察者。
     * 所谓活跃观察者，指的是那些生命周期处于 STARTED 或者 RESUMED 状态的观察者。
     * 要是没有活跃观察者，LiveData 就不会发送值的更新通知
     */
    if (userLiveData.hasObservers()) {
      userLiveData.postValue(user2)
    }
  }

  /**
   * 保存用户手机号码
   * @param phone String?
   */
  fun saveUserPhone(phone: String?) {
    mmkv.encode(USER_PHONE_NUMBER, phone)
  }

  /**
   * 获取用户手机号码
   * @return String?
   */
  fun getUserPhone(): String? = mmkv.decodeString(USER_PHONE_NUMBER)

  /**
   * 获取用户 LiveData
   * @return MutableLiveData<User?>
   */
  fun getUserLiveData(): MutableLiveData<User?> = userLiveData

  /**
   * 保存用户本地头像
   * @param path String?
   */
  fun saveUserPhoto(path: String?) {
    val user = getUserInfo()
    user?.apply {
      // 将本地 头像路径保存到用户信息中
      icon = path
      // 重新保存用户信息
      saveUserInfo(this)
    }
  }

  /**
   * 清除用户信息
   */
  fun clearUserInfo() {
    mmkv.remove(USER_INFO_DATA)
    mmkv.remove(USER_PHONE_NUMBER)
    // 清除 LiveData 的值
    if (userLiveData.hasObservers()) {
      userLiveData.postValue(null)
    }
  }
}